package com.seewintech.framework.common.exception;

import lombok.Getter;

import java.text.MessageFormat;


/**
 * @author by xiaoTian
 * @date 2022/6/14.
 */
/**
 * 服务异常
 * <p>
 * 一共 10 位，分成四段
 * <p>
 * 第一段，1 位，类型
 * 1 - 业务级别异常
 * 2 - 系统级别异常
 * 第二段，3 位，系统类型
 * 001 - 基础系统
 * 002 - 机器系统
 * 003 - 用户系统
 * 第三段，3 位，模块
 * 不限制规则。
 * 一般建议，每个系统里面，可能有多个模块，可以再去做分段。以用户系统为例子：
 * 001 - OAuth2 模块
 * 002 - User 模块
 * 003 - MobileCode 模块
 * 第四段，3 位，错误码
 * 不限制规则。
 * 一般建议，每个模块自增。
 *
 */
@Getter
public class ServiceException extends RuntimeException {

    private final Integer code;

    public ServiceException(int code, String message) {
        super(message);
        this.code = code;
    }

    public ServiceException(String message) {
        super(message);
        code=null;
    }

    public static ServiceException ServiceException(int code, String message,String ...args) {
        String messageFormat = MessageFormat.format(message,args);
        return new ServiceException(code, messageFormat);
    }

    public static ServiceException buildWithCodeAndMessage(int code, String message) {
        return new ServiceException(code, message);
    }

    public static ServiceException buildWithCodeAndMessage(String message) {
        return new ServiceException( message);
    }

    public static ServiceException buildWithCodeAndMessage(int code, String message,String ...args) {
        String messageFormat = MessageFormat.format( message,args);
        return new ServiceException(code, messageFormat);
    }

    public static ServiceException buildWithExceptionEnum(ExceptionEnum exceptionEnum) {
        return ServiceException.buildWithCodeAndMessage(exceptionEnum.getCode(), exceptionEnum.getMessage());
    }

    public static ServiceException buildWithExceptionEnum(String errorMsg) {
        return ServiceException.buildWithCodeAndMessage(errorMsg);
    }

    public static ServiceException buildWithExceptionEnum(ExceptionEnum exceptionEnum,String ...args) {
        return ServiceException.buildWithCodeAndMessage(exceptionEnum.getCode(), exceptionEnum.getMessage(),args);
    }

}
